package com.ego.ware.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ego.common.to.order.OrderTo;
import com.ego.common.to.ware.WareLockTaskTo;
import com.ego.common.vo.PageVo;
import com.ego.ware.po.PurchaseDetail;
import com.ego.ware.po.WareSku;
import com.ego.common.vo.product.SkuInStockVo;
import com.ego.ware.to.WareLockTo;
import com.ego.ware.vo.WareSkuSearchVo;

import java.util.List;

/**
 * @program: ego
 * @description 商品库存服务层
 * @author KamTang
 * @date 2022-11-13 13:30:29
 */
public interface WareSkuService extends IService<WareSku> {
    /**
     * 搜索商品库存
     * @param search @see
     * @return 商品库存
     * @see WareSkuSearchVo
     */
    PageVo<WareSku> search(WareSkuSearchVo search);

    /**
     * 入库操作
     * @param purchaseDetail @see
     * @see PurchaseDetail
     */
    void stock(PurchaseDetail purchaseDetail);

    /**
     * 查询有库存的SKU
     * @param skuIds skuIds
     * @return @see
     * @see SkuInStockVo
     */
    List<SkuInStockVo> inStock(List<Long> skuIds);

    /**
     * 订单提交时锁定库存
     * @param lockTo @see
     * @return 锁定成功或失败
     * @see WareLockTo
     */
    Boolean lock(WareLockTo lockTo);

    /**
     * 收到解锁哭粗消息，解锁库存
     * @param to @see
     * @see WareLockTaskTo
     */
    void releaseLock(WareLockTaskTo to);

    /**
     * 收到订单关闭消息，解锁库存
     * @param orderTo @see
     * @see OrderTo
     */
    void releaseLock(OrderTo orderTo);

    /**
     * 根据skuId获取有库存的仓库信息
     * @param skuIds skuId
     * @return @see
     * @see WareSku
     */
    List<WareSku> hasStockBySkuId(List<Long> skuIds);
}

